package org.jsola.hr.service;

import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.IEmpPaperContractDAO;
import org.jsola.hr.dto.EmpPaperContractAddDTO;
import org.jsola.hr.dto.EmpPaperContractDTO;
import org.jsola.hr.dto.EmpPaperContractUpdateDTO;
import org.jsola.hr.entity.EmpPaperContractDO;
import org.jsola.hr.query.EmpPaperContractQuery;
import org.jsola.hr.vo.EmpPaperContractExcelVO;
import org.jsola.hr.vo.EmpPaperContractListVO;
import org.jsola.hr.vo.EmpPaperContractVO;
import org.jsola.hr.vo.HrPaperContractCountVO;
import org.jsola.user.core.TokenUser;

import java.io.File;
import java.util.Date;
import java.util.List;


/**
 * 纸质合同
 *
 * @author zhr
 */
public interface IEmpPaperContractService extends IService<IEmpPaperContractDAO, EmpPaperContractDO> {

    /**
     * 新增纸质合同
     *
     * @param empPaperContractAddDTO 新增纸质合同DTO
     * @param tokenUser              当前用户
     * @return 纸质合同详情信息
     */
    EmpPaperContractVO save(EmpPaperContractAddDTO empPaperContractAddDTO, TokenUser tokenUser);

    /**
     * 新增纸质合同 保存do全部数据 仅用于更换公司使用
     *
     * @param empPaperContractDO 新增纸质合同DO
     * @return 纸质合同详情信息
     */
    Integer onlySave(EmpPaperContractDO empPaperContractDO);

    /**
     * 修改纸质合同
     *
     * @param empPaperContractUpdateDTO 修改纸质合同DTO
     * @param tokenUser                 当前用户
     * @return 更新数量
     */
    int update(EmpPaperContractUpdateDTO empPaperContractUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除纸质合同，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser           当前用户
     * @param empPaperContractIds 纸质合同id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String... empPaperContractIds);

    /**
     * 根据纸质合同id查找
     *
     * @param empPaperContractId 纸质合同id
     * @param siteId             所属站点id
     * @return 纸质合同详情信息
     */
    EmpPaperContractVO selectById(String empPaperContractId, String siteId);

    /**
     * 根据纸质合同id查找
     *
     * @param empPaperContractId 纸质合同id
     * @return 纸质合同详情信息
     */
    EmpPaperContractDO selectDOById(String empPaperContractId);

    /**
     * 查询纸质合同
     *
     * @param empPaperContractQuery 查询条件
     * @param siteId                所属站点id
     * @return 纸质合同列表信息
     */
    List<EmpPaperContractListVO> select(EmpPaperContractQuery empPaperContractQuery, String siteId);

    /**
     * 查询纸质合同记录数
     *
     * @param empPaperContractQuery 查询条件
     * @param siteId                所属站点id
     * @return 纸质合同记录数
     */
    int selectCount(EmpPaperContractQuery empPaperContractQuery, String siteId);

    /**
     * 分页查询纸质合同
     *
     * @param empPaperContractQuery 查询条件
     * @param siteId                所属站点id
     * @return 纸质合同列表信息
     */
    Page<EmpPaperContractListVO> selectPage(EmpPaperContractQuery empPaperContractQuery, String siteId);

    /**
     * 分页查询纸质合同(可以根据emp的相关信息搜索)
     *
     * @param empPaperContractQuery 查询条件
     * @param tokenUser          当前用户
     * @return 纸质合同列表信息
     */
    Page<EmpPaperContractListVO> selectPageByEmpInfo(EmpPaperContractQuery empPaperContractQuery, TokenUser tokenUser);


    /**
     * 根据纸质合同id查找
     *
     * @param empPaperContractId 纸质合同id
     * @param siteId             所属站点id
     * @return 纸质合同
     */
    EmpPaperContractDO selectDOById(String empPaperContractId, String siteId);

    /**
     * 查询纸质合同
     *
     * @param empPaperContractQuery 查询条件
     * @param siteId                所属站点id
     * @return 纸质合同列表
     */
    List<EmpPaperContractDO> selectDO(EmpPaperContractQuery empPaperContractQuery, String siteId);

    /**
     * 根据用户id添加纸质合同
     *
     * @param empPaperContractList 合同列表
     * @param companyId            公司id
     * @param empId                员工id
     * @param tokenUser            当前登陆信息
     */
    void publishEmpPaperContractList(List<EmpPaperContractDTO> empPaperContractList, String companyId, String empId, TokenUser tokenUser);

    /**
     * 根据员工id查询纸质合同
     *
     * @param empId  员工id
     * @param siteId 站点id
     * @return 纸质合同列表
     */
    List<EmpPaperContractDO> listContractByEmpId(String empId, String siteId);

    /**
     * 根据员工id查询纸质合同,并按照创建时间倒序
     *
     * @param companyId 用工单位id
     * @param empIdList 员工id列表
     * @param tokenUser 登录用户
     * @return 纸质合同列表
     */
    List<EmpPaperContractDO> listContractByEmpIdList(String companyId, List<String> empIdList, TokenUser tokenUser);

    /**
     * 根据员工id查询纸质合同,并按照创建时间倒序
     *
     * @param empIdList 员工id列表
     * @param tokenUser 登录用户
     * @return 纸质合同列表
     */
    List<EmpPaperContractDO> listContractByEmpIdList(List<String> empIdList, TokenUser tokenUser);

    /**
     * 查询所有未到期的纸质合同
     *
     * @return 纸质合同列表
     */
    List<EmpPaperContractDO> listAllNoExpireContract();


    /**
     * 导入excel
     *
     * @param file      excel
     * @param tokenUser 当前用户
     * @param companyId 公司Id
     * @return 成功的条数
     */
    EmpPaperContractExcelVO importFile(File file, TokenUser tokenUser, String companyId);

    /**
     * 统计纸质合同各种类型的数量(用工单位级使用，用工单位id必传)
     * @param companyId 用工单位id
     * @param tokenUser 当前用户
     * @return 各种类型的数量
     */
    HrPaperContractCountVO statisticsCountByCompanyId(String companyId, TokenUser tokenUser);

    /**
     * 查询全部纸质合同
     * @return 全部纸质合同
     */
    List<EmpPaperContractDO> selectAll();

    /**
     * 导出纸质合同列表
     *
     * @param empPaperContractQuery 查询参数
     * @param tokenUser 当前用户
     * @return 合同列表
     */
    String exportPaperContract(EmpPaperContractQuery empPaperContractQuery, TokenUser tokenUser);

    /**
     * 根据合同开始时间和结束时间 设置合同状态
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 合同状态;1:执行中 2:已到期 3:未执行
     */
    Integer getStatus(Date startTime, Date endTime);
}


